#include "stm32l0xx.h"                  // Device header
#include "gpio.h"
#include "NRF24L01_define.h"
#include "Delay.h"

uint8_t T_ADDR[5]={0xF0,0xF0,0xF0,0xF0,0xF0};
uint8_t R_ADDR[5]={0xF0,0xF0,0xF0,0xF0,0xF0};

void W_MOSI(uint8_t Value)
{
	HAL_GPIO_WritePin(MOSI_Port,MOSI_Pin,(GPIO_PinState)Value);
}

void W_SCK(uint8_t Value)
{
	HAL_GPIO_WritePin(SCK_Port,SCK_Pin,(GPIO_PinState)Value);
}

void W_CSN(uint8_t Value)
{
	HAL_GPIO_WritePin(CSN_Port,CSN_Pin,(GPIO_PinState)Value);
}

void W_CE(uint8_t Value)
{
	HAL_GPIO_WritePin(CE_Port,CE_Pin,(GPIO_PinState)Value);
}

uint8_t R_IRQ(void)
{
	return HAL_GPIO_ReadPin(IRQ_Port,IRQ_Pin);
}

uint8_t R_MISO(void)
{
	return HAL_GPIO_ReadPin(MISO_Port,MISO_Pin);
}

void NRF24L01_Pin_Init(void)
{
	//CubeMX自动生
}

//SPI交换一个字节
uint8_t SPI_SwapByte(uint8_t Byte)
{
	uint8_t i,ByteReceive=0x00;
	for(i=0;i<8;i++)
	{
		W_MOSI(Byte&(0x80>>i));
		W_SCK(1);
		if(R_MISO()==1)
		{
			ByteReceive=ByteReceive|(0x80>>i);
		}
		W_SCK(0);
	}
	return ByteReceive;
}

void W_Reg(uint8_t Reg,uint8_t Value)
{
	W_CSN(0);//表示选中NRF24L01
	SPI_SwapByte(Reg);//交换的第一个字节就是指令
	SPI_SwapByte(Value);//交换的第二个字节就是交换的数据
	W_CSN(1);//停止选中NRF24L01
}

uint8_t R_Reg(uint8_t Reg)
{
	uint8_t Value;
	W_CSN(0);//表示选中NRF24L01
	SPI_SwapByte(Reg);//交换的第一个字节就是指令
	Value=SPI_SwapByte(NOP);//交换的第二个字节就是交换的数据
	W_CSN(1);//停止选中NRF24L01
	return Value;
}

void W_Buf(uint8_t Reg , uint8_t* Buf, uint8_t Len)
{
	uint8_t i;
	W_CSN(0);//选中NRF24L01
	SPI_SwapByte(Reg);
	for(i=0;i<Len;i++)
	{
		SPI_SwapByte(Buf[i]);
	}
	W_CSN(1);//停止选中NRF24L01
}

void R_Buf(uint8_t Reg , uint8_t* Buf, uint8_t Len)
{
	uint8_t i;
	W_CSN(0);//选中NRF24L01
	SPI_SwapByte(Reg);
	for(i=0;i<Len;i++)
	{
		Buf[i]=SPI_SwapByte(NOP);
	}
	W_CSN(1);//停止选中NRF24L01
}


void NRF24L01_Init(void)
{
	NRF24L01_Pin_Init();
	
	W_CE(0);
	
	W_Buf(W_REGISTER+TX_ADDR, T_ADDR, 5);//配置发送地址
	W_Buf(W_REGISTER+RX_ADDR_P0, R_ADDR, 5);//配置接收通道0
	W_Reg(W_REGISTER+CONFIG,0x0F);//配置成接收模式
	W_Reg(W_REGISTER+EN_AA,0x01);//通道0开启自动应答
	W_Reg(W_REGISTER+RF_CH,0x00);//配置通信频率2.4G
	W_Reg(W_REGISTER+RX_PW_P0,32);//配置接收通道0接收的数据宽度32字节
	W_Reg(W_REGISTER+EN_RXADDR,0x01);//接收通道0使能
	W_Reg(W_REGISTER+SETUP_RETR,0x1A);//配置580us重发时间间隔,重发10次
	W_Reg(FLUSH_RX,NOP);
	
	W_CE(1);
}

void Receive(uint8_t* Buf)
{
	uint8_t Status;
	Status =R_Reg(R_REGISTER+STATUS);
	if(Status & RX_OK)
	{
		R_Buf(R_RX_PAYLOAD, Buf, 32);
		W_Reg(FLUSH_RX,NOP);
		W_Reg(W_REGISTER+STATUS, Status);
		HAL_Delay(1);
	}
}

uint8_t Send(uint8_t* Buf)
{
	uint8_t Status;
	W_Buf(W_TX_PAYLOAD, Buf, 32);//在发送数据缓存器发送要发送的数据
	
	W_CE(0);
	W_Reg(W_REGISTER+CONFIG,0x0E);
	W_CE(1);

	while(R_IRQ()==1);//等待中断
	Status= R_Reg(R_REGISTER+STATUS);
	
	if(Status & MAX_TX)//如果发送达到最大次数
	{
		W_Reg(FLUSH_TX,NOP);//清除发送数据缓存器
		W_Reg(W_REGISTER+STATUS,Status);//中断位写1清除中断
		return MAX_TX;
	}
	if(Status & TX_OK)//如果发送成功,接收到应答信号
	{
		W_Reg(W_REGISTER+STATUS,Status);//清除中断
		return TX_OK;
	}
}











